Windows 10にROS NoeticをインストールしてRealSense D455のbagファイルを解析する
IntelのRealSenseカメラは、RGB/depthなどのフレーム情報をROS(Robot Operating System)で採用されているbag形式で保存することができます。
bagファイルの保存と再生だけであれば、RealSense SDKに含まれているRealSense Viewerやlibrealsene APIで行えますが、フレーム単位の詳細な解析が行いたい場合は、ROSのbagファイル関連のツールを利用することができます。
本記事では、Windows10にROS1の最新ディストリビューションであるROS Noeticをインストールして、Intel RealSense D455のbagファイルを解析する手順を説明します。
(English version of this post is here↓)
Analyze RealSense D455’s ROS bag file with ROS Noetic on Windows 10
作業環境
- Windows10 Home (Ver. 20H2, build 19042.867)
- Intel RealSense D455
- Intel RealSense SDK 2.0 (v2.42.0)
- ROS Noetic Ninjemys
- Windows Terminal (Ver. 1.6.10571.0)
RealSense Viewerを使用したbagファイルの記録と再生
まず、RealSense Viewerを使用してROSで解析するためのbagファイルを作成します。RealSense SDKはPCにインストール済みとします。RealSense D455をPCに接続した状態で、RealSense Viewerを起動します。RealSense Viewerを起動した後にD455を接続してもOKです。
bagファイルの記録
RealSense Viewerが起動したら、フレーム情報を記録したいセンサーの設定を行い、各センサーのon/offトグルボタンをクリックしてストリーミングを開始します。
ストリーミングが開始した状態で「Record」ボタンをクリックすると、bagファイルの記録が開始されます。記録中に「Stop」ボタンをクリックすると記録が終了してbagファイルが作成されます。
bagファイルはフレームレートや解像度の設定次第で、ごく短い時間の記録でもファイルサイズが非常に大きくなる可能性があります。最初は数秒程度で記録を停止してどれくらいのファイルサイズになるかを把握してから、ストレージ容量が十分であることを確認したうえで長時間の記録を行うことをおすすめします。
bagファイルの保存場所は、RealSense Viewerウィンドウの右上にある歯車アイコンをクリックして、「Settings」を開くと確認と変更ができます。
bagファイルの再生
RealSense Viewerウィンドウの左上の「Add Source」をクリックしてから、「Load Recorded Sequence」を選択します。
エクスプローラーが表示されるので、作成したbagファイルを選択します。
選択したbagファイルが読み込まれると、そのまま再生がはじまります。デフォルトでは、リピート再生(bagファイルの終端まで再生したら、先頭から再生を続ける)モードがONになっています。
Windows10へのROS Noeticのインストール
ROS公式サイトのインストール手順に従い、ROS Noeticをインストールします。ROSのインストールにはVisual Studio 2019とChocolatolyとGitが必要になります。これらのインストール手順も以下のページに記載してあります。
noetic/Installation/Windows - ROS Wiki
インストール時の注意点
サイトに記載してある内容に従えば、特にハマる箇所はないと思われますが、"5.1 ROS Last Known Good (LKG) Build Installation"の以下のコマンド実行時に、パッケージのインストールがぜんぜん終わらない現象に遭遇しました。
choco upgrade ros-noetic-desktop_full -y --execution-timeout=0
しばらく待っても終わる気配が無かったため、あきらめて一度Ctrl-Cでコマンド実行を強制停止してからあらためて同じコマンドを実行したら、今度はすんなりと最後まですんなりとインストールが進みました。
ROSセットアップスクリプトの自動実行設定
ROSの機能はコマンドプロンプトからROSコマンドを実行することで利用できます。ROSコマンドが実行される前にセットアップスクリプトを実行する必要があります。インストール手順に従うと、このセットアップスクリプトを自動実行するショートカットと、Windows Terminalのプロファイルが設定できます。本記事では、以降はWindows TerminalからROSコマンドを起動します。
プロファイルは、Windows Terminalウィンドウ上部の「+」ボタンの右隣のボタンをクリックすると選択できます。
ROSツールを使用したRealSense D455のbagファイルの解析
rosbag infoコマンド
ROSがインストールできたので、早速RealSense D455のbagファイルを解析してみます。Windows TerminalでROSプロファイルを選択して、開いたコマンドプロンプト上でbagファイルが置いてあるフォルダに移動して、rosbag info
コマンドで解析したいbagファイルの概要を表示してみます。
実行結果には以下のような情報が含まれていました。
- ROS bag フォーマットバージョン情報
- メッセージの記録時間(秒)
- メッセージの開始時間と終了時間
- bagファイルサイズ
- ファイルに含まれるメッセージ数
- ファイル内容の圧縮の有無
- ファイルに含まれるメッセージのタイプ情報
- ファイルに含まれるメッセージのトピック情報
rosbag info
コマンドによると、RealSense D455のbagファイルはROS bag Version 2.0 フォーマットに準拠しているようです。メッセージの開始時間は実際に記録が開始された時間ではなく、UNIXエポックがセットされていました。
参考のために、手元のbagファイルに対してrosbag info
コマンドを実行した時の結果全体を以下に載せておきます。長いので折りたたんであります。
C:\bagfile>rosbag info d455-848x480-rgbd-30fps.bag path: d455-848x480-rgbd-30fps.bag version: 2.0 duration: 25.8s start: Jan 01 1970 09:00:00.00 (0.00) end: Jan 01 1970 09:00:25.76 (25.76) size: 1.5 GB messages: 36445 compression: none [1547/1547 chunks] types: diagnostic_msgs/KeyValue [cf57fdc6617a881a88c16e768132149c] geometry_msgs/Transform [ac9eff44abf714214112b05d54a3cf9b] realsense_msgs/StreamInfo [311d7e24eac31bb87271d041bf70ff7d] sensor_msgs/CameraInfo [c9a58c1b0b154e0e6da7578cb991d214] sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743] std_msgs/Float32 [73fcbf46b49191e672908e50842a83d4] std_msgs/String [992ce8a1687cec8c8bd883ec73ca41d1] std_msgs/UInt32 [304a39449588c7f8ce2df6e8001c5fce] topics: /device_0/info 13 msgs : diagnostic_msgs/KeyValue /device_0/sensor_0/Depth_0/image/data 773 msgs : sensor_msgs/Image /device_0/sensor_0/Depth_0/image/metadata 18552 msgs : diagnostic_msgs/KeyValue /device_0/sensor_0/Depth_0/info 1 msg : realsense_msgs/StreamInfo /device_0/sensor_0/Depth_0/info/camera_info 1 msg : sensor_msgs/CameraInfo /device_0/sensor_0/Depth_0/tf/0 1 msg : geometry_msgs/Transform /device_0/sensor_0/info 2 msgs : diagnostic_msgs/KeyValue /device_0/sensor_0/option/Asic_Temperature/description 1 msg : std_msgs/String /device_0/sensor_0/option/Asic_Temperature/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Depth_Units/description 1 msg : std_msgs/String /device_0/sensor_0/option/Depth_Units/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Emitter_Always_On/description 1 msg : std_msgs/String /device_0/sensor_0/option/Emitter_Always_On/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Emitter_Enabled/description 1 msg : std_msgs/String /device_0/sensor_0/option/Emitter_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Emitter_On_Off/description 1 msg : std_msgs/String /device_0/sensor_0/option/Emitter_On_Off/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Enable_Auto_Exposure/description 1 msg : std_msgs/String /device_0/sensor_0/option/Enable_Auto_Exposure/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Error_Polling_Enabled/description 1 msg : std_msgs/String /device_0/sensor_0/option/Error_Polling_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Exposure/description 1 msg : std_msgs/String /device_0/sensor_0/option/Exposure/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Frames_Queue_Size/description 1 msg : std_msgs/String /device_0/sensor_0/option/Frames_Queue_Size/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Gain/description 1 msg : std_msgs/String /device_0/sensor_0/option/Gain/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Global_Time_Enabled/description 1 msg : std_msgs/String /device_0/sensor_0/option/Global_Time_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Hdr_Enabled/description 1 msg : std_msgs/String /device_0/sensor_0/option/Hdr_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Laser_Power/description 1 msg : std_msgs/String /device_0/sensor_0/option/Laser_Power/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Output_Trigger_Enabled/description 1 msg : std_msgs/String /device_0/sensor_0/option/Output_Trigger_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Projector_Temperature/description 1 msg : std_msgs/String /device_0/sensor_0/option/Projector_Temperature/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Sequence_Id/description 1 msg : std_msgs/String /device_0/sensor_0/option/Sequence_Id/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Sequence_Name/description 1 msg : std_msgs/String /device_0/sensor_0/option/Sequence_Name/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Sequence_Size/description 1 msg : std_msgs/String /device_0/sensor_0/option/Sequence_Size/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Stereo_Baseline/description 1 msg : std_msgs/String /device_0/sensor_0/option/Stereo_Baseline/value 1 msg : std_msgs/Float32 /device_0/sensor_0/option/Visual_Preset/description 1 msg : std_msgs/String /device_0/sensor_0/option/Visual_Preset/value 1 msg : std_msgs/Float32 /device_0/sensor_0/post_processing 10 msgs : std_msgs/String /device_0/sensor_1/Color_0/image/data 773 msgs : sensor_msgs/Image /device_0/sensor_1/Color_0/image/metadata 16233 msgs : diagnostic_msgs/KeyValue /device_0/sensor_1/Color_0/info 1 msg : realsense_msgs/StreamInfo /device_0/sensor_1/Color_0/info/camera_info 1 msg : sensor_msgs/CameraInfo /device_0/sensor_1/Color_0/tf/0 1 msg : geometry_msgs/Transform /device_0/sensor_1/info 2 msgs : diagnostic_msgs/KeyValue /device_0/sensor_1/option/Auto_Exposure_Priority/description 1 msg : std_msgs/String /device_0/sensor_1/option/Auto_Exposure_Priority/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Backlight_Compensation/description 1 msg : std_msgs/String /device_0/sensor_1/option/Backlight_Compensation/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Brightness/description 1 msg : std_msgs/String /device_0/sensor_1/option/Brightness/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Contrast/description 1 msg : std_msgs/String /device_0/sensor_1/option/Contrast/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Enable_Auto_Exposure/description 1 msg : std_msgs/String /device_0/sensor_1/option/Enable_Auto_Exposure/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Enable_Auto_White_Balance/description 1 msg : std_msgs/String /device_0/sensor_1/option/Enable_Auto_White_Balance/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Exposure/description 1 msg : std_msgs/String /device_0/sensor_1/option/Exposure/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Frames_Queue_Size/description 1 msg : std_msgs/String /device_0/sensor_1/option/Frames_Queue_Size/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Gain/description 1 msg : std_msgs/String /device_0/sensor_1/option/Gain/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Gamma/description 1 msg : std_msgs/String /device_0/sensor_1/option/Gamma/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Global_Time_Enabled/description 1 msg : std_msgs/String /device_0/sensor_1/option/Global_Time_Enabled/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Hue/description 1 msg : std_msgs/String /device_0/sensor_1/option/Hue/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Power_Line_Frequency/description 1 msg : std_msgs/String /device_0/sensor_1/option/Power_Line_Frequency/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Saturation/description 1 msg : std_msgs/String /device_0/sensor_1/option/Saturation/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/Sharpness/description 1 msg : std_msgs/String /device_0/sensor_1/option/Sharpness/value 1 msg : std_msgs/Float32 /device_0/sensor_1/option/White_Balance/description 1 msg : std_msgs/String /device_0/sensor_1/option/White_Balance/value 1 msg : std_msgs/Float32 /device_0/sensor_1/post_processing 1 msg : std_msgs/String /device_0/sensor_2/info 1 msg : diagnostic_msgs/KeyValue /device_0/sensor_2/option/Enable_Motion_Correction/description 1 msg : std_msgs/String /device_0/sensor_2/option/Enable_Motion_Correction/value 1 msg : std_msgs/Float32 /device_0/sensor_2/option/Frames_Queue_Size/description 1 msg : std_msgs/String /device_0/sensor_2/option/Frames_Queue_Size/value 1 msg : std_msgs/Float32 /device_0/sensor_2/option/Global_Time_Enabled/description 1 msg : std_msgs/String /device_0/sensor_2/option/Global_Time_Enabled/value 1 msg : std_msgs/Float32 /file_version 1 msg : std_msgs/UInt32
rqt_bagコマンド
次に、bagファイルの可視化ツールであるrqt_bagコマンドでbagファイルの詳細を確認します。GUIをぐりぐり操作するので、動画にしました。rqt_bag
コマンド実行する前に、別のコマンドプロンプトでroscore
コマンドを実行しておく必要があります。
rqt_bagでbagファイルをロードする時のエラー対処
rqt_bagのウィンドウが開いてから、bagファイルをロードしようとした時に以下のようなエラーが発生しました。
こちらの情報等を参考にして、
bag_timeline.py
のエラー発生箇所を以下のとおり修正することでエラーは解消しました。
まとめ
Intel RealSense D455のbagファイルをROSのツールで解析する方法をご紹介しました。bagファイルは元々ROSから生まれたものなので、ROSのエコシステムに親しむことで、ロボット以外でRealSenseデバイスを使用した開発にも便利に活用できそうです。
参照
- Intel® RealSense™ Computer Vision - Depth and Tracking cameras
- Intel RealSense for Developers - Build your own computer vision apps
- ROS.org | Powering the world's robots
- Bags - ROS Wiki
- noetic/Installation/Windows - ROS Wiki
- rqt_bag - ROS Wiki
- ROS講座29 rosbagを使う - Qiita
- Timeline not displayed due to no '_mergesort' function · Issue #90 · ros-visualization/rqt_bag